深入探究C语言中的常量指针与野指针概念及其应用 您所在的位置:网站首页 C语言 memcpy 野指针 深入探究C语言中的常量指针与野指针概念及其应用

深入探究C语言中的常量指针与野指针概念及其应用

2024-05-09 17:01| 来源: 网络整理| 查看: 265

常量指针(Constant Pointers)

在C语言中,const关键字用于声明常量,而野指针则是一种危险的指针类型。下面将详细解释这两个概念及其应用。

常量指针是指指向常量的指针,它不能用来修改所指向的数据。这有助于保护数据不被意外修改,提高程序的安全性和可维护性。

1. 指向常量的指针

当你想阻止通过指针修改数据时,可以使用指向常量的指针。这种指针的类型是指向常量的指针类型,例如 int * const p;。这意味着你不能通过这个指针来修改它所指向的数据。

2. 常量指针

另一种形式是常量指针,即指针本身的值不能被修改,但可以通过该指针修改其指向的数据。这种指针的类型是指向非常量的常量指针类型,例如 const int *p;。这意味着你不能修改指针 p 所指向的数据的值。

以下是一个使用const声明常量的示例:

代码语言:javascript复制#include int main() { const int a = 10;//a具有了常属性(不能被修改了) //a本质上还是变量 //在C++中,const修饰的变量就是常量 //a = 20; 错误,a修改不了 //int arr[a]; 错误 a不算常量值 printf("%d\n", a); return 0; }

在这个示例中,我们声明了一个名为a的整型常量,并将其初始化为10。然后我们使用printf函数输出a的值。注意,我们不能修改a的值,否则编译器会报错。

通过修改被const修饰的a的地址,修改a的值

代码语言:javascript复制int main() { const int a = 10; //a = 20;//error int* p = &a; *p = 0; printf("a = %d\n", a); return 0; //}

const位置的不同

代码语言:javascript复制//const 修饰指针变量的时候,放在*的右边 //const 限制的是指针变量本身,指针变量不能再指向其他变量了 //但是可以通过指针变量,修改指针变量指向的内容 int main() { int a = 10; int b = 20; int* const p = &a; //一但指向a就不能指向b了 //p = &b;//error *p = 100;//修改*p却可以 printf("a = %d\n", a); return 0; } //const 修饰指针变量的时候,放在*的左边 //限制的是指针指向的内容,不能修改指针指向的内容 //但是可以修改指针变量本身的值(修改指针变量的指向) int main() { int a = 10; int b = 20; int const* p = &a; //一但指向a就不能指向b了 p = &b;//OK //*p = 100;//error printf("a = %d\n", a); return 0; } //int const* const p = &a //*两边都加上const 就都改不了了 int main() { int a = 10; int b = 20; int const* const p = &a; //一但指向a就不能指向b了 //p = &b;//error //*p = 100;//error printf("a = %d\n", a); return 0; } 指针的应用

利用指针打印数组的几种方式

代码语言:javascript复制//用指针打印数组 int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int* p = &arr[0]; int sz = sizeof(arr) / sizeof(arr[0]); for (int i = 0; i < sz; i++) { printf("%d ", *p); p++; } return 0; } //另一种方法 int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int* p = &arr[0]; int sz = sizeof(arr) / sizeof(arr[0]); for (int i = 0; i < sz; i++) { printf("%d ", *(p+i)); } return 0; } //利用指针的关系运算打印数组 int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int* p = arr;//等于 &arr[0]; int sz = sizeof(arr) / sizeof(arr[0]); while (p < arr + sz) { printf("%d ", *p); p++; } return 0; } //指针-指针的前提是,两个指针指向同一个空间 int main() { int arr[10] = { 0 }; printf("%zd ", &arr[9] - &arr[0]);//9 return 0; }

野指针(Wild Pointers)的产生

野指针通常产生于**未初始化的指针、指针越界访问以及指向已释放内存的指针**。具体如下:

1. 未初始化的指针:定义指针变量时,如果没有进行初始化,那么该指针的值是随机的,可能指向任意的内存地址。这种情况下,如果尝试通过这个指针去读取或写入数据,可能会导致程序崩溃或其他不可预期的行为。

2. 指针越界访问:当指针超出了它所指向的数据结构(如数组)的边界时,就会发生越界访问。例如,一个指向大小为10的数组的指针,如果尝试访问数组的第12个元素,就会造成越界。

3. 指向已释放内存的指针:当一块内存被释放后,原有的指针如果继续指向这块内存,而没有置空或者重新赋值,这个指针就变成了所谓的“悬挂指针”或“野指针”。

为了避免野指针的产生和影响,应当总是在声明指针时对其进行初始化,并在释放指针指向的内存后立即将指针置为NULL,同时确保指针在其有效作用域内使用。

代码如下:

代码语言:javascript复制//未初始化指针,产生的野指针 int main() { int* p;//p是一个局部变量,不初始化的默认存的是随机值 *p = 20; //报错 printf("%d \n", p); return 0; } //数组越界,产生的野指针 int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int* p = &arr[0]; int sz = sizeof(arr) / sizeof(arr[0]); for (int i = 0; i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有